#pragma once
#include"Comm.hpp"
#include<sys/epoll.h>
class Epoll
{
    public:
    static const int gsize=256;//参数已被废弃，任意一个大于0的数都可以
    static const int gtimeout = 5000;
    public:
    Epoll(int timeout = gtimeout):_timeout(timeout)
    {}
    void CreatePoll()
    {
        _epfd = epoll_create(gsize);
        if(_epfd < 0)
            exit(CRE_EPOLL_ERR);
    }
    bool CtlEpoll(int sock,uint32_t events)
    {
        events |= EPOLLET;//设置ET模式，边缘触发
        struct epoll_event ev;
        ev.events = events;
        ev.data.fd = sock;
        int n = epoll_ctl(_epfd,EPOLL_CTL_MOD,sock,&ev);
        return n==0;//创建成功
    }
    bool AddSockToEpoll(int sock,uint32_t events)
    {
        //管理sock
        struct epoll_event ev;
        ev.events = events;
        ev.data.fd = sock;
        int n = epoll_ctl(_epfd,EPOLL_CTL_ADD,sock,&ev);
        return n==0;
    }
    int WaitEpoll(struct epoll_event revs[],int num)
    {
        //如果底层就绪的sock非常多，revs承装不下，怎么办？？不影响！一次拿不完，就下一次再拿
        //关于epoll_wait的返回值问题：有几个fd上的事件就绪，就返回几，epoll返回的时候，会将所有
        //就绪的event按照顺序放入到revs数组中！一共有返回值个
        return epoll_wait(_epfd,revs,num,_timeout);
    }
    bool DelFromEpoll(int sock)
    {
        int n = epoll_ctl(_epfd,EPOLL_CTL_DEL,sock,nullptr);
        return n==0;
    }
    ~Epoll()
    {
        if(_epfd)
            close(_epfd);
    }
    private:
        int _epfd;
        int _timeout;
};